package cn.com.w.docx4j.demo;


import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.*;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;
import java.math.BigInteger;

/**
 * 创建word文档
 */

@SpringBootTest(classes = Docx4jAppLanuch.class)
public class CreateDocx {

    @Test
    public void test() {
        System.out.println(System.getProperty("user.dir"));
    }

    /**
     * 创建空白word文档
     * @throws Exception
     */
    @Test
    public void createEmptyDocx() throws Exception{
        // 生成一个WordprocessingMLPackage实例，包含有docx文件的所有内容，分为若干个部分。
        WordprocessingMLPackage pkg = WordprocessingMLPackage.createPackage();
        // 保存到指定的文件中。save函数有多个重载，可以保存到IO流中。
        pkg.save(new File(System.getProperty("user.dir"), "Empty.docx"));
    }

    /**
     * 简单写入hello world
     * @throws Exception
     */
    @Test
    public void helloWorld() throws Exception{
        WordprocessingMLPackage pkg = WordprocessingMLPackage.createPackage();
        // docx文件中的文档部分MainDocumentPart。
        MainDocumentPart main = pkg.getMainDocumentPart();
        // Document对象表示文档本身。
        Document doc = main.getContents();

        // Document中的Body对象表示前景内容，还有Background对象表示背景内容。
        Body body = doc.getBody();

        // 各种元素的工厂对象
        ObjectFactory factory = Context.getWmlObjectFactory();

        // 创建一个段落（Paragraph，P）
        P para = factory.createP();
        // 为段落创建一个文本块（Run，R）
        R run = factory.createR();
        // 为文本块创建一个文本（Text）
        Text text = factory.createText();
        text.setValue("Hello World");

        // 文本加入文本块
        run.getContent().add(text);
        // 文本块加入段落
        para.getContent().add(run);
        // 段落加入文档
        body.getContent().add(para);
        // 重复一遍
        body.getContent().add(para);
        pkg.save(new File(System.getProperty("user.dir"), "Simple_Hello_World.docx"));
    }

    /**
     * hello world 格式版
     * @throws Exception
     */
    @Test
    public void helloWorldFormat() throws Exception{
        WordprocessingMLPackage pkg = WordprocessingMLPackage.createPackage();

        // docx文件中的文档部分MainDocumentPart。
        MainDocumentPart main = pkg.getMainDocumentPart();
        // Document对象表示文档本身。
        Document doc = main.getContents();
        // Document中的Body对象表示前景内容，还有Background对象表示背景内容。
        Body body = doc.getBody();

        // 各种元素的工厂对象
        ObjectFactory factory = Context.getWmlObjectFactory();

        // 创建一个段落（Paragraph，P）
        P para = factory.createP();
        // 为段落创建一个文本块（Run，R）
        R run = factory.createR();
        // 为文本块创建一个文本（Text）
        Text text = factory.createText();
        text.setValue("Hello World! 你好，世界！");

        // 创建段落格式
        PPr ppr = factory.createPPr();

        // 设置居中对齐
        Jc jc = factory.createJc();
        jc.setVal(JcEnumeration.CENTER);
        ppr.setJc(jc);

        // 设置缩进和间距
        // 这里用的单位是Twentieths of a point (dxa)，1/20点
        PPrBase.Ind ind = new PPrBase.Ind();
        ind.setFirstLine(BigInteger.valueOf(22 * 20));
        ppr.setInd(ind);

        PPrBase.Spacing spacing = new PPrBase.Spacing();
        spacing.setBefore(BigInteger.valueOf(0));
        spacing.setAfter(BigInteger.valueOf(0));
        spacing.setLine(BigInteger.valueOf(24 * 10));
        ppr.setSpacing(spacing);

        // 设置段落格式
        para.setPPr(ppr);

        // 创建文本格式
        RPr rpr = factory.createRPr();
        // 设置文本颜色
        Color color = new Color();
        // 红色
        // color.setVal("red")同样有效
        color.setVal("FF0000");
        rpr.setColor(color);

        // 设置字体类型
        RFonts rf = factory.createRFonts();
        rf.setAscii("Times New Roman");
        rf.setHAnsi("Times New Roman");
        rf.setEastAsia("微软雅黑");
        rpr.setRFonts(rf);
        // 设置字体大小
        // 字体大小单位是HpsMeasure，即Half-points，半个点
        HpsMeasure size = new HpsMeasure();
        size.setVal(BigInteger.valueOf(24));
        rpr.setSz(size);
        rpr.setSzCs(size);

        // 设置文本格式
        run.setRPr(rpr);

        // 文本加入文本块
        run.getContent().add(text);
        // 文本块加入段落
        para.getContent().add(run);
        // 段落加入文档
        body.getContent().add(para);
        // 重复一遍
        body.getContent().add(para);
        pkg.save(new File(System.getProperty("user.dir"), "Hello_World_with_Formats.docx"));
    }
}
